﻿package net.cooltain.warhammer.running.entity;

import java.util.ArrayList;
import java.util.List;

import net.cooltain.warhammer.framework.constant.ConstantCardType;

public abstract class ZoneEntity {

	protected Integer zoneConstant ;
	protected MotionPlayerZone player ;
	protected List<MotionCard> cards = new ArrayList<MotionCard>();
	
	/** 是否需要重绘 */
	protected boolean isNeedRepaint = true;
	
	/**
	 * 初始化
	 * @param player
	 */
	public ZoneEntity(MotionPlayerZone player){
		this.player = player;
	}
	
	
	/**
	 * 总牌数
	 * @return
	 */
	public int getCardSize(){
		return this.cards.size();
	}
	
	/**
	 * 只放置一排，一排的张数<br>
	 * 注1：卡片的附加卡不列入计数<br>
	 * 注2：设施卡列入计数<br>
	 * 注3：TODO 考虑任务卡的情况 
	 * @return
	 */
	public int getCardSizeOneRow(){
		int count = 0;
		for(MotionCard card: cards){
			if(card.isDevelopment()){
				count++;
			}else if(card.isAttachment()){
				// do nothing ;
			}else {
				count ++ ;
			}
		}
		return count;
	}
	
	/**
	 * 放置两排，第一排放置张数
	 * 注1：卡片的附加卡不列入计数<br>
	 * 注2：只有单位卡列入统计<br>
	 * 注3：任务卡如果有单位不统计，任务卡如果没有单位则列入统计
	 * @return
	 */
	public int getCardSizeRow1(){
		int count = 0;
		for(MotionCard card: cards){
			if(card.isDevelopment()){
				// do nothing 
			}else if(card.isAttachment()){
				// do nothing ;
			}else if(card.cardEntity.getType()==ConstantCardType.CARD_TYPE_QUEST ){				
				if( card.getQuestUnitCard()==null){
					// 如果是任务卡，并且任务卡上没有正在执行的单位卡
					count ++ ;
				}
			}else if(card.cardEntity.getType()==ConstantCardType.CARD_TYPE_UNIT ){
				// 如果是单位卡
				count ++ ;
			}
		}
		return count;
	}
	
	/**
	 * 放置两排，第二排放置张数
	 * 注1：卡片的附加卡不列入计数<br>
	 * 注2：只有支援卡以及设施卡列入统计<br>
	 * @return
	 */
	public int getCardSizeRow2(){
		int count = 0;
		for(MotionCard card: cards){
			if(card.isDevelopment()){
				count ++ ;
			}else if(card.isAttachment()){
				// do nothing ;
			}else if(card.cardEntity.getType()==ConstantCardType.CARD_TYPE_QUEST ){
				// do nothing ;
			}else if(card.cardEntity.getType()==ConstantCardType.CARD_TYPE_Developer ){
				count ++ ;
			}
		}
		return count;
	}
	
	
	/**
	 * 获得所有卡
	 * @return
	 */
	public List<MotionCard> getCards(){
		return this.cards;
	}
	
	/**
	 * 单排显示时，获得所有卡
	 * 注1：从左到右：部队卡、支援卡、设施卡
	 * @return
	 */
	public List<MotionCard> getCardsOneRow(){
		List<MotionCard> list = new ArrayList<MotionCard>();
		List<MotionCard> supportlist = new ArrayList<MotionCard>();
		List<MotionCard> developerlist = new ArrayList<MotionCard>();
		for(MotionCard card: cards){
			if(card.isDevelopment()){
				developerlist.add(card);
			}else if(card.isAttachment()){
				// do nothing ;
			}else if(card.cardEntity.getType()==ConstantCardType.CARD_TYPE_SUPPORT ){
				supportlist.add(card);
			}else if(card.cardEntity.getType()==ConstantCardType.CARD_TYPE_QUEST ){
				if( card.getQuestUnitCard()==null){
					// 如果是任务卡，并且任务卡上没有正在执行的单位卡
					list.add(card);
				}
			}else {
				list.add(card);
			}
		}
		list.addAll(supportlist);
		list.addAll(developerlist);
		return list;
	}
	
	/**
	 * 获得第一排的所有卡
	 * 注1：所有部队卡,
	 * 注2：任务卡如果没有单位执行则列入，任务卡如果有单位执行则不列入，在显示部队卡的时候显示相应任务卡
	 * @return
	 */
	public List<MotionCard> getCardsRow1(){
		List<MotionCard> list = new ArrayList<MotionCard>();
		for(MotionCard card: cards){
			if(card.isDevelopment()){
				// do nothing 
			}else if(card.isAttachment()){
				// do nothing ;
			}else if(card.cardEntity.getType()==ConstantCardType.CARD_TYPE_QUEST ){
				if( card.getQuestUnitCard()==null){
					// 如果是任务卡，并且任务卡上没有正在执行的单位卡
					list.add(card);
				}
			}else {
				list.add(card);
			}
		}
		return list;
	}
	
	/**
	 * 获得第二排的所有卡,并且设施卡放在最后面
	 * 注1：发展卡、设施卡
	 * @return
	 */
	public List<MotionCard> getCardsRow2(){
		List<MotionCard> list = new ArrayList<MotionCard>();
		List<MotionCard> developerlist = new ArrayList<MotionCard>();
		for(MotionCard card: cards){
			if(card.isDevelopment()){
				developerlist.add(card);
			}else if(card.isAttachment()){
				// do nothing ;
			}else if(card.cardEntity.getType()==ConstantCardType.CARD_TYPE_QUEST ){
				// do nothing ;
			}else if(card.cardEntity.getType()==ConstantCardType.CARD_TYPE_Developer ){
				list.add(card);
			}
		}
		list.addAll(developerlist);
		return list;
	}

	/**
	 * 获取指定类型的卡片
	 * @param type
	 * @return
	 */
	public List<MotionCard> getCardsByType(Integer type){
		List<MotionCard> cardList = new ArrayList<MotionCard>();
		for(MotionCard card : this.cards){
			if(type==ConstantCardType.CARD_TYPE_Developer){
				if(card.isDevelopment()){
					cardList.add(card);				
				}
			}else{
				if(!card.isDevelopment() && card.cardEntity.getType()==type){
					cardList.add(card);
				}
			}
		}
		return cardList;
	}


    // =========================================================================
    
    /**
     * 事件:该区域增加一张卡
     */
    public void eventAddCard(MotionCard card){
        this.cards.add(card);
        card.currentZone = zoneConstant ;
        this.isNeedRepaint = true;
    }

    /**
     * 事件:该区域移除一张卡
     */
    public void eventRemoveCard(MotionCard card){
    	this.cards.remove(card); 
    	card.currentZone = null;
    	this.isNeedRepaint = true;
    }


	public boolean isNeedRepaint() {
		return isNeedRepaint;
	}

	public void setNeedRepaint(boolean isNeedRepaint) {
		this.isNeedRepaint = isNeedRepaint;
	}
	
	public void setNeedRepaintTrue() {
		this.isNeedRepaint = true;
	}
	
	public void setNeedRepaintFalse() {
		this.isNeedRepaint = true;
	}

    
    
}
